//
// link list data struct
//
#ifndef _LINK_H_
#define _LINK_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned int uint_t;

struct link_list_node {
	void * value;
	struct link_list_node *prev;
	struct link_list_node *next;
};

typedef struct link_list_node link_list_node_t;

typedef struct {
	uint_t size;
	link_list_node_t * head;
	link_list_node_t * tail;
} link_list_t;

typedef void ( * link_free_callback_fn_t ) ( void * );

// create a link
link_list_t * new_link_list();

// append a node to the tail of link
void link_list_add(link_list_t *, void *);

// remove the node of the specified index
void link_list_remove(link_list_t *, uint_t);
// remove the specified node
void link_list_remove_node(link_list_t *, void *);

// destroy the link
void link_list_destroy(link_list_t *, link_free_callback_fn_t);

// free memory for link node value
void free_link_node_value(void *);

#endif    /*end ifndef*/


